# --*-- conding:utf-8 --*--
# @Time : 2025/6/19 15:05; 2025/8/11 16:30
# @Author : Xu
# @Email : wsxzy98@outlook.com
# @File : stock_quant_package.py
# @Software : VScode

from odoo import models, _
from odoo.exceptions import UserError

class StockQuantPackage(models.Model):
    _inherit = 'stock.quant.package'
    
    #删包裹
    def action_force_delete(self):
        MoveLine = self.env['stock.move.line']
        Quant = self.env['stock.quant']

        for pkg in self:
            # 1) 先把相关 move line 的包裹引用清空（避免残留引用）
            mls = MoveLine.search([
                '|',
                ('package_id', '=', pkg.id),
                ('result_package_id', '=', pkg.id),
            ])
            if mls:
                mls.write({'package_id': False, 'result_package_id': False})

            # 2) 找到包裹里的全部 quants
            quants = Quant.search([('package_id', '=', pkg.id)])

            # 2.1) 安全检查：已预留的不允许硬删（防止把已预留数量蒸发）
            reserved = quants.filtered(lambda q: (q.reserved_quantity or 0.0) > 0.0)
            if reserved:
                raise UserError(_(
                    '包裹 %s 内存在已预留的库存，无法强制删除。\n'
                    '请先取消相关拣货/预留后再试。受影响的 quant IDs: %s'
                ) % (pkg.name or pkg.id, ','.join(map(str, reserved.ids))))

            # 3) 真正减少库存：直接删除这些 quants（而不是解绑）
            #    这一步会让库存总量按这些 quant 的 quantity 真实减少
            if quants:
                quants.unlink()

        # 4) 最后删除包裹本身（用 ORM，别直 SQL）
        self.unlink()

        # 返回到包裹列表
        return self.env.ref('stock.action_package_view').read()[0]
    
    # def action_force_delete(self):
    #     MoveLine = self.env['stock.move.line']
    #     Quant = self.env['stock.quant']

    #     # 查找并解除move line
    #     move_lines = MoveLine.search([
    #         '|',
    #         ('package_id', 'in', self.ids),
    #         ('result_package_id', 'in', self.ids)
    #     ])
    #     move_lines.write({'package_id': False, 'result_package_id': False})

    #     # 查找并解除quant
    #     quants = Quant.search([('package_id', 'in', self.ids)])
    #     quants.write({'package_id': False})

    #     # 如果还有quant没解除就报错
    #     left_quants = Quant.search([('package_id', 'in', self.ids)])
    #     if left_quants:
    #         raise UserError(_('还有未解除的stock.quant记录，无法彻底删除包裹，请检查数据！ids: %s' % left_quants.ids))

    #     # 彻底物理删除
    #     for pkg in self:
    #         self.env.cr.execute("DELETE FROM stock_quant_package WHERE id=%s", (pkg.id,))
    #     return self.env.ref('stock.action_package_view').read()[0]

    # def unlink(self):
    #     def unlink(self):
    #     # 解除所有相关 move line、quant 的包裹引用（两种外键都要清空！）
    #         MoveLine = self.env['stock.move.line']
    #         Quant = self.env['stock.quant']
    #         MoveLine.search([('package_id', 'in', self.ids)]).write({'package_id': False})
    #         MoveLine.search([('result_package_id', 'in', self.ids)]).write({'result_package_id': False})
    #         Quant.search([('package_id', 'in', self.ids)]).write({'package_id': False})
    #         # 调用原生unlink真正删除
    #         return models.Model.unlink(self)